package com.cskaoyan.javase.oop1._13block._1building._1basic;

/**
 * 构造代码块为什么能够有这种特点呢？它的原理是什么呢？
 * 通过查看反编译.class文件,发现
 * 代码中是不存在构造代码块这种结构的
 * 说明:
 * 编译后,会将构造代码块中的代码放进类的构造器当中去.
 * 这就是构造代码块随着构造器而执行的原理.
 *
 * 以上就是基本的原理,细节问题是:
 * 1.具体把显式赋值还是把构造代码块赋值语句,放进构造器,会灵活进行
 *      但是不管如何,都是为了保证:
 *      按照代码顺序,执行显式赋值和构造代码块赋值
 *
 * 2.构造代码块的代码,放进构造器中,是放入类中的每一个构造器,而不是某个构造器
 *      而且是放入每一个构造器代码的前几行
 *      保证构造代码块先于构造器执行.
 *
 * 3.一个类,在new对象时,类中的显式赋值 构造代码块赋值 代码
 * 最多只会执行一次
 * 所以类中构造器,如果有this调用其他构造器,是不会将构造代码块中的代码放进去的
 *
 * @since 14:55
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Pet p = new Pet();
        System.out.println(p.price);

        System.out.println("------------------");
        Pet p2 = new Pet(300);
        System.out.println(p2.price);
    }
}

class Pet {
    double price = 100;
    {
        price = 200;
        System.out.println("hello world!");
    }

    public Pet() {
        System.out.println("无参构造");
    }

    public Pet(double price) {
        this();
        this.price = price;
    }
}